package ar.com.ctrln.view.dashboard.ventas.factibilidad;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.mantenimiento.factibilidad.ConsultarFactibilidadCliente;
import ar.com.ctrln.persistence.model.factibilidad.Factibilidad;
import ar.com.ctrln.persistence.model.factibilidad.FactibilidadCliente;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ConsultarFactibilidadController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7729776081089431884L;

	@WireVariable
	private ConsultarFactibilidadCliente consultarFactibilidadCliente;

	@Wire
	private Window wConsultarFactibilidad;

	@Wire
	private Listbox lbFactibilidad;

	@Wire("#txtFilter")
	private Textbox txtFilter;

	@Wire
	private Label footer_label;

	@Wire
	private Button btnVerDetalle;

	@SuppressWarnings("rawtypes")
	private EventQueue actualizarFactibilidad;

	ListModelList<Factibilidad> modelo;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		modelo = new ListModelList<Factibilidad>();

		modelo.addAll(consultarFactibilidadCliente.listar());

		lbFactibilidad.setModel(modelo);

		lbFactibilidad.setMultiple(false);

		lbFactibilidad.setCheckmark(false);

		actualizarFactibilidad = EventQueues.lookup("actualizarFactibilidad",
				EventQueues.DESKTOP, true);
		actualizarFactibilidad.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				modelo.clear();
				modelo.addAll(consultarFactibilidadCliente.listar());
				lbFactibilidad.setModel(modelo);

				lbFactibilidad.setMultiple(false);

				lbFactibilidad.setCheckmark(false);
			}
		});
	}

	@Listen("onClick = #btnVerDetalle")
	public void verDetalle() {
		if (lbFactibilidad.getSelectedItem() == null) {
			Clients.showNotification("Debe seleccionar una Factibilidad",
					lbFactibilidad);
		} else {

			Factibilidad factibilidad = lbFactibilidad.getSelectedItem()
					.getValue();

			wConsultarFactibilidad.setAttribute("factibilidad", factibilidad);
			Executions.createComponents(
					"/zul/mantenimiento/factibilidad/verFactibilidad.zul",
					wConsultarFactibilidad, null);

		}

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onChanging = #txtFilter")
	public void getFilter(Event event) {
		((Textbox) event.getTarget())
				.setValue(((org.zkoss.zk.ui.event.InputEvent) event).getValue());
		lbFactibilidad.setModel(new ListModelList(getFilterBy(
				txtFilter.getValue(), modelo.getInnerList())));
		if (lbFactibilidad.getItemCount() > 0) {
			footer_label.setValue("");
			footer_label.setValue("Un total de "
					+ lbFactibilidad.getItemCount() + " Factibilidad/es");
		} else {
			footer_label.setValue("Ningun Resultado...");
			footer_label.setValue("");
		}
		((Textbox) event.getTarget()).setFocus(true);
	}

	public static List<Factibilidad> getFilterBy(String condicion,
			Collection<Factibilidad> servicios) {
		List<Factibilidad> data = new ArrayList<Factibilidad>();
		for (Iterator<Factibilidad> i = servicios.iterator(); i.hasNext();) {
			Factibilidad t = i.next();
			if (t instanceof FactibilidadCliente) {
				FactibilidadCliente tmp = (FactibilidadCliente) t;
				if (tmp.getTipoFactibilidad().toLowerCase()
						.indexOf(condicion.trim().toLowerCase()) >= 0
						|| tmp.getEstado().toLowerCase()
								.indexOf(condicion.trim().toLowerCase()) >= 0
						|| tmp.getFechaAltaString().toLowerCase()
								.indexOf(condicion.trim().toLowerCase()) >= 0
						|| tmp.getRazonSocial().toLowerCase()
								.indexOf(condicion.trim().toLowerCase()) >= 0) {
					data.add(tmp);
				}
			}

		}
		return data;
	}

}